﻿#pragma once

#include <QtGui/QMainWindow>
#include "Toolbar.h"
#include "DocWidget.h"

#include "Dialog.h"
#include "Thread.h"
#include "FormConfig.h"
#include "FormStatistic.h"
#include "Plot.h"

QT_BEGIN_NAMESPACE
class QAction;
class QListWidget;
class QMenu;
class QTextEdit;
class QProgressDialog;
QT_END_NAMESPACE

struct config
{
	config() : currMtr(-1),coutModeling(0),coutAnaliz(0),nPerf(100),mSize(10)
	{}
	// индекс текущей матрицы
	long currMtr;	
	// количество проведенных экспирементов
	long coutModeling;
	// количество проведенный анализов чисел обусловленности
	long coutAnaliz;
	// общее количество необходимых вычислений
	long nPerf;
	// размерность матрицы
	long mSize;
	// id текущего закона распределения
	long idLaw;
	// точность при которой число обусловленности считается
	// отдельной вариантой
	float epsCond;
};

class CMainWindow : public QMainWindow
{
	Q_OBJECT


signals:
	// сигнал испускается при начеле вычислений
	void BeginProgress(int);	
	// сигнал испускается при завершениия вычислений
	void DoneProgress();		

private slots:
	// запускает процесс вычисления и обработки результатов
	int  runPerforms();	
	// завершение процесса вычислений и очистка данных
	int	 stopPerforms();
	// callback при изменение состояния вычислений
	void sendProgress();
	//void showResultInFolder();
	// обновлений виджетов отображения данных
	void updateDataWidget();
	// обновлений виджетов отображения статистической информации
	void updateStatisticWidget();
	int  updateTableMtr(int selectRow = 0);
	void updateTableCond();
	void sortCondDown();
	void sortCondUP();
	void unsortCond();
	void exportCondMatLab();
	void exportMatrix();
	void exportCond();
	void updateHistogram();
	int  importData();
	int  openData();
	int  saveData();
	int  clearData();
	void about();

public:
	CMainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
	~CMainWindow();
	// ui
	Config *ConfDialog;
	CStatisticCond *StatCond;

private:
	void setupWidget();
	void setupActions();
	void setupMenuBar();
	void setupToolBars();
	void setupStatusBar();
	void setupDockWidg();
	void setupTable();
	void setupPlot();
	
	QWidget *WidgMain;
	QVBoxLayout *layoutMain;
	QTimer *timer;
	QSplitter *mainSplit;
	QSplitter *rightSplit;
	QBoxLayout *layoutMtr;
	QBoxLayout *layoutCondNum;
	// Plot
	Plot *plotHist;
	Plot *plotFuncFreq;
	Plot *plotFuncIntegral;

	QwtPlotGrid *grid;
	// Table
	QTableWidget		*tableMtr;
	QTableWidgetItem	*tItmsMtr;
	QTableWidget		*tableCond;
	QTableWidgetItem	*tItmsCond;
	QTableWidget		*tableStat;
	QTableWidgetItem	*tItmsStat;
	QTableWidget		*tableSum;
	// Action
	QAction *openFileAct;
	QAction *saveFileAct;
	QAction *exportCondAct;
	QAction *exportCondMatLabAct;
	QAction *exportMtrAct;
	QAction *importAct;
	QAction	*quitAct;
	QAction	*performsAct;
	QAction	*configAct;
	QAction	*sortCondUpAct;
	QAction *sortCondDownAct;
	QAction *unsortCondAct;
	QAction *funcDistAct;
	QAction *statInfoAct;
	QAction *aboutSC;
	QAction *plotCondAct;
	QAction *plotFreqAct;
	QAction *plotDistAct;
	QAction *clearHistoryAct;
	// Menu
	QMenu	*fileMenu;
	QMenu	*exportMenu;
	// Tab
	QTabWidget *TabCommon;
	QTabWidget *TabPlot;
	QTabWidget *TabCond;
	// ToolBar
	ToolBar *tbFile;
	ToolBar *tbModeling;
	ToolBar *tbOptions;
	ToolBar *tbSet;
	ToolBar *tbTools;
	ToolBar *tbPlot;

	//DockWidget *dwViewFile;
	// Form & dialog
	// DocWidget
	DockWidget *dwTableCond;
	DockWidget *dwTableCondStat;
	DockWidget *dwPlotStatInfo;
	Dialog *formConfig;
	
	QProgressDialog *progDialog;
	QDoubleSpinBox *dSpinBoxEps;
};

//extern CCoreSPCN *pSPCN;